Skip to content

DEV: add program case analytics - #730

Merged
TThanos3000 merged 1 commit into
devfrom
feature/dev-program-case-analytics-api
Sep 7, 2026
Merged

TThanos3000 merged 1 commit into
devfrom
feature/dev-program-case-analytics-api

Conversation

@TThanos3000

Copy link
Copy Markdown
Collaborator

Изменения

Добавлена read-only аналитика проектов по системному кейсу в существующий GET /programs/:programId/manager-overview/. Новый endpoint и drilldown не создаются; прежние поля ответа не изменены.

  • База: 77c8d41e2139c5902f2c7958d499fe26b9c4ef79 (origin/dev, проверен после fetch).
  • Head: d7cbb8846997212f623efab20680ebc8d701a1e6.
  • Ветка: feature/dev-program-case-analytics-api.
  • Один feature commit; 8 файлов, +538 / −14 строк.

Контракт и семантика

Новый top-level блок:

cases:
  configured: boolean
  submission_applicable: boolean
  items:
    - name: string
      participants_total: integer >= 0
      projects_total: integer >= 0
      not_submitted: integer >= 0
      submitted: integer >= 0
  without_case:
    participants_total: integer >= 0
    projects_total: integer >= 0
    not_submitted: integer >= 0
    submitted: integer >= 0
  • Кейс определяется только точным name="case" через существующий PROGRAM_CASE_FIELD_NAME / get_program_case_field(). Label, тип, show_filter и похожие имена не используются как эвристики.
  • Текущие options — source of truth: сохранён порядок конфигурации и включены нулевые строки, без сортировки по количеству проектов.
  • Единица подсчёта — PartnerProgramProject текущей программы, не глобальный Project. Состояния одного проекта в программах A/B изолированы.
  • without_case включает отсутствующие, пустые и неактуальные значения. При отсутствии системного поля configured=false, items=[], все связи входят в without_case.
  • submission_applicable = program.is_competitive. Счётчики статуса всегда используют только raw PartnerProgramProject.submitted, в том числе для noncompetitive; draft/public/timestamp их не переопределяют.
  • Участники — уникальные пользователи, зарегистрированные в этой программе и являющиеся leader или Collaborator соответствующего проекта. Orphan-профили, приглашения, участники другой программы и один лишь profile.project не учитываются. Пользователь дедуплицируется внутри каждого bucket, включая without_case, но может входить в разные кейсы: сумма participants по кейсам не является global unique.
  • Reconciliation: сумма items + without_case совпадает с solution_funnel.created/submitted/not_submitted; внутри bucket projects_total = submitted + not_submitted.
  • Явные serializers проверяют неотрицательность всех счётчиков и не выполняют SQL.

SQL и regression tests

Helper выполняет фиксированные 4 SQL-запроса: definition, grouped link counts, registered leader pairs, registered collaborator pairs. Число запросов одинаково для 1 и 20 options. Бюджет manager overview увеличен только на эти четыре запроса: с 10 до 14; budgets assignment list/scores не изменены.

Добавлено 13 tests: базовые метрики/reconciliation, zero/options order, точное имя, отсутствующие/legacy значения, no-case, noncompetitive, multi-program, реальное membership/dedup, query count и serializer. Текущая схема запрещает duplicate profile для пары user/program; regression подтверждает constraint. Существующее value_text не nullable: отсутствие записи даёт NULL из subquery и покрыто тестом без изменения схемы.

Проверки

  • Новый модуль case analytics: 13/13 passed.
  • Расширенные targeted analytics/case/canonical-fields: 204 tests, 201 passed, 3 PostgreSQL-only skipped локально на SQLite.
  • Backend PostgreSQL CI, выполнен для exact head через существующий workflow_dispatch: passed. PostgreSQL vendor и select_for_update, проверки Django/models/migration drift, миграции на пустую PostgreSQL 15 DB — passed; targeted locking/response 39/39, полный backend suite 824/824, без skips.
  • Обычный GitHub CI: passed; полный suite 824 tests, 820 passed, 4 PostgreSQL-only skipped, lint passed.
  • Локальный Windows/SQLite full suite: 824 tests, 819 passed, 1 failure, 4 skipped. Неизменённый feed.tests.test_feed_api.FeedAPITests.test_feed_returns_project_news_as_news_content ожидает первым news, но получает project; сбой воспроизводится и отдельным запуском этого теста с --keepdb. Затем при teardown full suite возник WinError 32 удаления занятого test_db.sqlite3. Оба Linux CI прошли полный suite, включая этот feed-тест. Feed-код не менялся и не исправлялся вне scope.
  • Black (6 изменённых Python-файлов): passed.
  • Scoped flake8: passed. Full flake8 7.3.0, соответствующий convention существующего CI (актуальный flake8): passed; GitHub CI lint тоже passed. Старый локальный flake8 5.0.4 сообщает 29 замечаний в неизменённых файлах; unrelated форматирование не выполнялось. Для повторения CI использован изолированный lint tool вне репозитория, без изменений project dependencies.
  • manage.py check, manage.py check --tag models, makemigrations --check --dry-run: passed, новых migrations нет.
  • git diff --check, git diff --cached --check: passed.

Локальные Windows Django tests использовали существующий внешний WeasyPrint stub для отсутствующей native-библиотеки; Linux PostgreSQL CI выполнен с реальными зависимостями репозитория, без этого stub.

Файлы и границы

  • partner_programs/services/case_analytics.py
  • partner_programs/services/analytics.py
  • partner_programs/serializers/analytics.py
  • partner_programs/tests/test_case_analytics_api.py
  • partner_programs/tests/test_manager_analytics_api.py
  • partner_programs/tests/test_assignment_analytics_api.py
  • docs/program-case-field.md
  • docs/program-manager-analytics-api.md

Обновлена документация контракта, participant semantics, reconciliation и SQL budget. Модели, migrations, case validation/option protection, canonical GET/PUT fields, submission, admin, filters, evaluation, team/invite rules не изменены. Angular, React, dependencies, workflows, Docker и deploy не затронуты.

Draft PR в dev. Merge и deploy не выполнялись.

@TThanos3000
TThanos3000 marked this pull request as ready for review September 7, 2026 09:37
@TThanos3000
TThanos3000 merged commit 63ebc4a into dev Sep 7, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant